package com.org.flow.element.aspect;

import com.org.flow.system.service.LogService;
import com.yomahub.liteflow.aop.ICmpAroundAspect;
import com.yomahub.liteflow.core.NodeComponent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

/**
 * 类描述：全局切面  打印流程流转信息  可以在此处进行统一的异常处理
 * 下边方法的优先级我按照数字标识  数字越小 优先级越高
 * @author xú chūn chéng
 * @version 1.0.0
 * @since 1.0.0  2024-02-26 09:31:48
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class GlobeLogAspect implements ICmpAroundAspect {
    private final LogService logService;

    /**
     * 方法描述：所有组件执行前执行的方法 （  优先级 1 ）
     *
     * @since 1.0.0   2024-02-26 09:41:52
     */
    @Override
    public void beforeProcess(NodeComponent cmp) {
        log.info(cmp.getChainId() + " - " + cmp.getNodeId() + " : " + cmp.getName() + " :执行开始! ");
    }

    /**
     * 方法描述：方法描述：所有组件执行结束后执行的方法 （  优先级 3）
     *
     * @param cmp cmp
     * @author xú chūn chéng
     * @since 1.0.0   2024-02-26 09:42:28
     */
    @Override
    public void afterProcess(NodeComponent cmp) {
        log.info(cmp.getChainId() + " - " + cmp.getNodeId() + " : " + cmp.getName() + " :执行结束! ");
    }

    /**
     * 方法描述： 执行结束 结果为成功时执行 （ 优先级 2）   【onSuccess / onError 只会执行一个】
     *
     * @since 1.0.0   2024-02-26 09:42:45
     */
    @Override
    public void onSuccess(NodeComponent cmp) {
        log.info("chain_name [{} | {}] \n {}", cmp.getChainId(), cmp.getDisplayName(), cmp.getSlot().getExecuteStepStr());
    }

    /**
     * 方法描述：方法描述： 执行结束 结果为异常时执行 （ 优先级 2）【onSuccess / onError 只会执行一个】
     *
     * @since 1.0.0   2024-02-26 09:42:48
     */
    @Override
    public void onError(NodeComponent cmp, Exception e) {
        log.error("chain_name [{} | {}] \n {}", cmp.getChainId(), cmp.getDisplayName(), cmp.getSlot().getExecuteStepStr());
        logService.insErrorLog(cmp, e);
    }
}
